package com.cy.java.oop;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

class Point{
    private int x;
    private int y;
    public Point(int x,int y){
        this.x=x;
        this.y=y;
        System.out.println(x+" "+y);
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

public class ReflectTests {
    public static void main(String[] args) throws Exception {
        //作业:
        //创建一个对象实例，
        Class clazz = Point.class;
        //1.通过反射构建Point类型的实例对象
        //获取构造方法
        Constructor c = clazz.getConstructor(int.class, int.class);
        //调用构造方法，创建point实例化对象
        Point o = (Point) c.newInstance(12, 13);
        //2.通过反射为point类实例的属性直接赋值
        //通过反射获取类里的属性，并且设置属性可见
        Field d = clazz.getDeclaredField("x");
        Field d1 = clazz.getDeclaredField("y");
        d.setAccessible(true);
        d1.setAccessible(true);
        //通过一个实例对象去给属性赋值
        d.set(o,14);
        d1.set(o,15);
        System.out.println(d.get(o)+"  "+d1.get(o));
        //3.通过反射调用point类的实例方法为属性赋值
//        Method[] declaredMethods = clazz.getDeclaredMethods();
//        System.out.println(Arrays.toString(declaredMethods));
        //获取指定名字和参数的方法
        Method setX = clazz.getDeclaredMethod("setX", int.class);
        //设置方法可见性
        setX.setAccessible(true);
        //调用该方法，并且通过指定的实例对象来执行它，并给它赋一个值。
        setX.invoke(o,16);
        //以下同理。
        Method setY = clazz.getDeclaredMethod("setY", int.class);
        setY.setAccessible(true);
        setY.invoke(o, 17);
        //4.通过反射调用point类的get方法获取属性值.
        Method getX = clazz.getDeclaredMethod("getX");
        getX.setAccessible(true);
        System.out.println(getX.invoke(o));

        Method getY = clazz.getDeclaredMethod("getY");
        getY.setAccessible(true);
        System.out.println(getY.invoke(o));

    }
}